package unrn.isiii.bean.rest;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import unrn.isiii.dao.ILineaDao;
import unrn.isiii.dao.IPuntoDao;
import unrn.isiii.dao.IRecorridoDao;
import unrn.isiii.dao.IUsuarioDao;
import unrn.isiii.model.Coordenada;
import unrn.isiii.model.PojoTraking;
import unrn.isiii.model.Punto;
import unrn.isiii.model.Recorrido;
import unrn.isiii.service.ws.LineaEndPoint;
import unrn.isiii.service.ws.Message;

@Component
@Path("/punto")
public class LatLngRestService {

	@Autowired
	ILineaDao iLineaDao;
	@Autowired
	IUsuarioDao iUsuarioDao;
	
	@Autowired
	private IRecorridoDao iRecorridoDao;
	@Autowired
	private IPuntoDao  iIPuntoDao;

	@POST
	@Path("/traking")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public Message traking(PojoTraking pojoTraking) {
		Recorrido recorrido;
		try {
			if (getiLineaDao().findByNombre(pojoTraking.getLinea()) != null	&& getiUsuarioDao().findByUserName(pojoTraking.getUsuario()) != null) {
			
				Coordenada coordenada = new Coordenada();
				coordenada.setLatitud(pojoTraking.getLat());
				coordenada.setLongitud(pojoTraking.getLng());
				
				List<Recorrido> lista = iRecorridoDao.recorridoByLinea(pojoTraking.getLinea());
				if (lista.size()==0){
					recorrido = new Recorrido(getiLineaDao().findByNombre(pojoTraking.getLinea()));
					recorrido.add(new Punto(coordenada));
					iRecorridoDao.create(recorrido);					
					iRecorridoDao.utils(recorrido);
				}else{
					recorrido = lista.get(0);
					Punto punto = new Punto(coordenada);
					punto.setRecorrido(recorrido);
					iIPuntoDao.create(punto);
				}
				
				LineaEndPoint.sendLinea(new Message(pojoTraking));
				return (new Message(pojoTraking));
			} else
				return new Message(pojoTraking, "No existe usuario y/o linea");

		} catch (Exception e) {
			return new Message(pojoTraking, "No existe usuario y/o linea");
		}

	}

	@GET
	@Path("/{lat}/{lng}/{linea}/{usuario}")
	@Produces(MediaType.APPLICATION_JSON)
	public Message consulta(@PathParam("lat") Double lat,
			@PathParam("lng") Double lng, @PathParam("linea") String linea,
			@PathParam("usuario") String usuario) {
		try {
			if (getiLineaDao().findByNombre(linea) != null
					&& getiUsuarioDao().findByUserName(usuario) != null) {
				LineaEndPoint.sendLinea(new Message(usuario, linea, linea, lat,
						lng));
				return (new Message(usuario, linea, linea, lat, lng));
			} else
				return new Message(usuario, linea, "No existe Linea", lat, lng);

		} catch (Exception e) {
			return new Message(usuario, linea, "No existe Linea o Usuario",
					lat, lng);
		}

	}

	public ILineaDao getiLineaDao() {
		return iLineaDao;
	}

	public void setiLineaDao(ILineaDao iLineaDao) {
		this.iLineaDao = iLineaDao;
	}

	public IUsuarioDao getiUsuarioDao() {
		return iUsuarioDao;
	}

	public void setiUsuarioDao(IUsuarioDao iUsuarioDao) {
		this.iUsuarioDao = iUsuarioDao;
	}

}